///////////////////////////////////////////////////////////////////////////////
//
//  The contents of this file are subject to the Mozilla Public License
//  Version 1.1 (the "License"); you may not use this file except in
//  compliance with the License. You may obtain a copy of the License at
//  http://www.mozilla.org/MPL/
//
//  Software distributed under the License is distributed on an "AS IS"
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//  License for the specific language governing rights and limitations
//  under the License.
//
//  The Original Code is MP4v2.
//
//  The Initial Developer of the Original Code is Kona Blend.
//  Portions created by Kona Blend are Copyright (C) 2008.
//  All Rights Reserved.
//
//  Contributors:
//      Kona Blend, kona8lend@@gmail.com
//
///////////////////////////////////////////////////////////////////////////////

#ifndef MP4V2_IMPL_ITMF_COVERARTBOX_H
#define MP4V2_IMPL_ITMF_COVERARTBOX_H

namespace mp4v2
{
    namespace impl
    {
        namespace itmf
        {

            ///////////////////////////////////////////////////////////////////////////////

            /// Functional class for covr-box (Cover-art Box) support.
            ///
            class MP4V2_EXPORT CoverArtBox
            {
            public:
                /// Data object for covr-box item.
                /// This object correlates to one covr->data atom and offers automatic
                /// memory freeing when <b>autofree</b> is true.
                ///
                class MP4V2_EXPORT Item
                {
                public:
                    Item();
                    Item( const Item & );
                    ~Item();

                    Item &operator=( const Item & );

                    /// Reset to state of newly constructed object.
                    /// If <b>buffer</b> is not NULL and <b>autofree</b> is true the
                    /// buffer will be free'd.
                    void reset();

                    BasicType type;     ///< covr-box type.
                    uint8_t  *buffer;   ///< buffer point to raw covr-box data.
                    uint32_t  size;     ///< size of covr-box buffer size in bytes.
                    bool      autofree; ///< when true invoke free(buffer) upon destruction.
                };

                /// Object representing a list of covr-box items.
                typedef vector<Item> ItemList;

                /// Fetch list of covr-box items from file.
                ///
                /// @param hFile on which to operate.
                /// @param out vector of ArtItem objects.
                ///
                /// @return <b>true</b> on failure, <b>false</b> on success.
                ///
                static bool list( MP4FileHandle hFile, ItemList &out );

                /// Add covr-box item to file.
                /// Any necessary metadata atoms are first created.
                /// Additionally, if an empty data-atom exists it will be used,
                /// otherwise a new data-atom is added to <b>covr-atom</b>.
                ///
                /// @param hFile on which to operate.
                /// @param item covr-box object to place in file.
                ///
                /// @return <b>true</b> on failure, <b>false</b> on success.
                ///
                static bool add( MP4FileHandle hFile, const Item &item );

                /// Replace covr-box item in file.
                ///
                /// @param hFile on which to operate.
                /// @param item covr-box object to place in file.
                /// @param index 0-based index of image to replace.
                ///
                /// @return <b>true</b> on failure, <b>false</b> on success.
                ///
                static bool set( MP4FileHandle hFile, const Item &item, uint32_t index );

                /// Fetch covr-box item from file.
                ///
                /// @param hFile on which to operate.
                /// @param item covr-box object populated with data.
                ///     The resulting object owns the malloc'd buffer and <b>item.autofree</b>
                ///     is set to true for convenient memory management.
                /// @param index 0-based index of image to fetch.
                ///
                /// @return <b>true</b> on failure, <b>false</b> on success.
                ///
                static bool get( MP4FileHandle hFile, Item &item, uint32_t index );

                /// Remove covr-box item from file.
                ///
                /// @param hFile on which to operate.
                /// @param index 0-based index of image to remove.
                ///     Default value indicates wildcard behavior to remove all items.
                ///
                /// @return <b>true</b> on failure, <b>false</b> on success.
                ///
                static bool remove( MP4FileHandle hFile, uint32_t index = numeric_limits<uint32_t>::max() );
            };

            ///////////////////////////////////////////////////////////////////////////////

        }
    }
} // namespace mp4v2::impl::itmf

#endif // MP4V2_IMPL_ITMF_COVERARTBOX_H
